package cn.stimd.spring.transaction.support;

import java.io.Flushable;

/**
 * 事务同步回调接口
 * 实现了Ordered接口的TransactionSynchronization将按顺序执行，没有实现Ordered接口的则加入执行链的末尾。
 * <p>
 * Created by Stimd
 * 项目地址：https://gitee.com/stimd/spring-wheel
 * 公众号：Java编程探微
 */
public interface TransactionSynchronization extends Flushable {
    int STATUS_COMMITTED = 0;
    int STATUS_ROLLED_BACK = 1;
    int STATUS_UNKNOWN = 2;

    /**
     * 挂起同步，解绑TransactionSynchronizationManager管理的资源
     */
    void suspend();

    /**
     * 恢复同步，将资源绑定到TransactionSynchronizationManager上
     */
    void resume();

    /**
     * 提交事务前调用（beforeCompletion前），比如将ORM框架的Session刷新到数据库
     * 该回调并不意味着事务真正被提交
     */
    void beforeCommit(boolean readOnly);

    /**
     * 在事务提交或回滚前调用，用于清理资源。该方法在beforeCommit后调用，且允许在事务完成前关闭资源
     */
    void beforeCompletion();

    /**
     * 在事务提交后调用
     */
    void afterCommit();

    /**
     * 事务完成后清理资源
     */
    void afterCompletion(int status);

    @Override
    void flush();
}
